package com.learn.a05_2_mars_photos.rules

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.setMain
import org.junit.rules.TestWatcher
import org.junit.runner.Description

@OptIn(ExperimentalCoroutinesApi::class)
/*
 * TestDispatcherRule类用于在单元测试中控制协程的调度器，
 * 使得我们可以在测试中使用特定的TestDispatcher（如UnconfinedTestDispatcher）。
 */
class TestDispatcherRule(
    /*
     * testDispatcher字段是一个TestDispatcher类型的实例，默认使用UnconfinedTestDispatcher。
     * UnconfinedTestDispatcher允许我们在测试中不受到线程切换的影响，便于测试协程代码。
     */
    private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher()
): TestWatcher() {
    /*
     * starting方法是在测试开始前被调用的方法。
     * 它会将主线程的调度器设置为我们提供的testDispatcher。
     * 这样可以确保测试中的协程运行在我们指定的调度器上。
     */
    override fun starting(description: Description) {
        Dispatchers.setMain(testDispatcher)
    }

    /*
     * finished方法是在测试结束后被调用的方法。
     * 它会重置主线程的调度器为默认值。
     * 这样做是为了避免影响其他测试用例。
     */
    override fun finished(description: Description) {
        Dispatchers.resetMain()
    }
}